#include<bits/stdc++.h>
using namespace std;
const int p=1e9+7;
inline void ls1(int &x){
  if((x<<=1)>=p)x-=p;
}
int main(){
  freopen("disanti.in","r",stdin);
  freopen("disanti.out","w",stdout);
  ios::sync_with_stdio(false);
  int n,m; cin>>n>>m;
  vector<string> s(n);
  for(auto &i:s)cin>>i;
  if(n==1){
    vector<int> P2(m);
    for(int i=P2[0]=1;i<m;i++)
      ls1(P2[i]=P2[i-1]);
    int c=0;
    for(int i=1;i<m;i++)
      if(s[0][i-1]==s[0][i])c++;
    for(int i=0;i<m;i++){
      int r=c;
      if(i)s[0][i]!=s[0][i-1]?c++:c--;
      if(i<m-1)s[0][i]!=s[0][i+1]?c++:c--;
      cout<<P2[c]<<' ';
      c=r;
    }
    cout<<endl;
  }
  else if(n*m<=16){
    auto F=[&](int x,int y){
      return x*m+y;
    };
    int L=n*(m-1)+m*(n-1);
    for(int i=0;i<n;i++,cout<<'\n')
      for(int j=0;j<m;j++){
        s[i][j]^=1;
        int c=0; bool f=true; vector<int> b(n*m);
        for(int S=0;S<1<<L;S++,f=true){
          for(int w=0,x,y;w<n*(m-1);w++)
            if(S>>w&1){
              x=w/(m-1),y=w%(m-1);
              if(s[x][y]!=s[x][y+1]){f=false; break;}
              b[F(x,y)]=b[F(x,y+1)]=S;
            }
          if(f)for(int h=n*(m-1),x,y;h<L;h++)
            if(S>>h&1){
              x=(h-n*(m-1))/m,y=(h-n*(m-1))%m;
              if(s[x][y]!=s[x+1][y]||b[F(x,y)]==S||b[F(x+1,y)]==S){f=false; break;}
            }
          if(f)c++;
        }
        cout<<c<<' ',s[i][j]^=1;
      }
  }
  return 0;
}